package com.cskaoyan.javase.oop3._2inner._3local._1basic;

/**
 * @description: 局部内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 在了解局部内部类的访问特点之前,先明确以下:
 *      局部内部类和外围类还是"好兄弟",所以局部内部类仍然可以无条件访问外围类成员
 *          但是局部内部类发生了变化,作用域被限制了方法内部,
 *          所以外围类除了装内部类的方法外的其他方法无法访问内部类成员了
 *
 *
 * 局部内部类的访问特点
 *  1.在局部内部类中访问外围类成员
 *      a.在外围类的普通成员方法中
 *         因为隐含this,所以不需要创建对象就可以直接访问
 *         如果同名咋办?
 *         当前内部类对象this,外围类对象 外围类类名.this
 *
 *      b.在外围类的静态成员方法中
 *          没有this传参,没有隐含外围类对象,想要访问外围类成员需要先创建对象
 *          如果同名,不需要区分,只有用外围类对象名点访问的才是外围类成员
 *
 *  2.在外围类的方法中访问局部内部类成员(仅限于装了内部类的方法)
 *          必须在局部内部类定义的下面创建它的对象,然后才能访问,并且不受权限限制
 *
 *  3.在外围类的其他方法中访问局部内部类成员
 *       访问不到,因为根本不知道有局部内部类
 *
 *  4.在外部类中访问局部内部类成员
 *      更访问不到
 *
 *  5.在局部内部类当中访问外部类成员
 *      是可以的,但是需要创建对象,受访问权限限制
 *
 */
public class Demo {
}

class EnclosedClazz {

    //外围类成员
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    //成员方法中局部内部类
    public void testEnclosed() {
        class Inner {
            int a;
            private int b = 10;
            static final int D = 30;
            //成员方法
            public void testInner(){
                //隐含了两个对象传参: 当前内部类对象this,外围类对象 外围类类名.this
                System.out.println(EnclosedClazz.this.a);
                System.out.println(b);
                System.out.println(EnclosedClazz.c);
                System.out.println(EnclosedClazz.D);
            }
        }

        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(i.b);
    }

    public static void testEnclosedStatic(){
        //没有隐含this,没有外围类对象
        class Inner {
            //成员方法
            public void testInner(){
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(ec.a);
                System.out.println(ec.b);
            }
        }
    }

}
